使用内存安全工具提升应用质量和安全性
Bilibili 视频链接
https://www.bilibili.com/video/BV1Ga41187oJ/
什么是内存安全错误
内存错误是指在使用 C 或 C++ 等原生语言处理内存时发生的错误。
void BufferOverflow() {
char *p = new char[10];
p[20] = 'x'; // 💣💥 在分配的数组之外写入
}
void UseAfterFree() {
char *p = new char[10];
delete[] p;
p[0] = 'x'; // 💣💥 在数组已经被释放之后写入
}
在这个例子中,我们可以看到最常见的两种错误形式,分别是 Buffer Overflow (缓冲区溢出) 和 Use After Free (释放后使用)。
使用内存安全工具
我们的任务是帮助开发者确保内存安全,帮助您避免在使用原生代码处理内存时造成错误和漏洞。因此,我们开发了一套工具以便检测并帮助开发者提高工作效率,这使得检测和修复此类错误变得比以往更轻松。
HWASan: 基于编译器的内存错误检测工具
GWP-ASan: 基于分配器的概率性内存错误检测工具
Arm MTE: 基于硬件的内存错误检测工具
HWASan
HWASan 从 Android 10 开始提供,它可以检测各类内存错误包括堆栈、全局和堆问题。使用该工具需要重新编译,因为它需要在所有内存操作中引入额外的代码来运行,所以该工具可能不适合在生产环境中部署。引入 HWASan 大约会使应用的性能降低两倍,我们建议您在开发和测试阶段中使用 HWASan。
将 HWASan 刷写到您的测试设备上
使用 -fsanitize=hwaddress 参数重新构建您的应用
运行
我们为大多数 Pixel 设备维护 HWASan 构建,虽然该工具的性能不适合在生产环境中部署,但用于测试是足够的。在内部我们使用 HWASan 构建来对新的 Pixel 设备进行 dogfood 测试。如果您想了解更多关于 HWASan 的详细信息,请查阅文档指南 HWAddress Sanitizer:
https://developer.android.google.cn/ndk/guides/hwasan
GWP-ASan
GWP-ASan 是我们在 Android 11 中引入的一款概率性内存错误检测工具,概率性是指随机保护某些堆分配,这样能在性能和捕获错误的几率之间取得平衡。这有点像彩票系统,随着运行代码库的设备数量增加,检测到错误的几率也会增加。GWP-ASan 不需要重新编译,其性能非常适合用于生产环境,强烈建议您从开发初期一直到测试和部署到生产环境的各个阶段都使用 GWP-ASan。
将 gwpAsanMode 添加到 Android 清单文件 运行
Arm MTE
Arm MTE 是我们与 Arm 合作开发的基于硬件的内存错误检测工具,我们将随着新硬件的推出在未来逐步为开发者提供这款工具。虽然这类硬件技术在一些 Android 设备上可用,但我们强烈建议应用开发者们去熟悉 HWASan 与 GWP-ASan 以便在各类兼容的设备间更为顺畅的过渡。
运行代码并查找问题
在 Android 12 中引入了新的 Tombostone API
https://developer.android.google.cn/about/versions/12/features#provide_apps_direct_access_to_tombstone_traces
修复问题
△ 内存安全工具提供了包含分配和取消分配回溯的错误报告
总结
Android 内存安全工具可以检测代码库中的内存错误,修复此类错误可帮助提高质量和安全性。确保内存安全的诀窍是使用内存安全工具运行代码找到错误,然后修复这些错误。
感谢您阅读本文章,期待您使用我们所提供的工具提升 Android 生态系统的质量和安全性,如果您遇到任何问题或有任何反馈,请通过 Github Issues 与我们取得联系。
Github Issues https://github.com/android/ndk/issues
推荐阅读